#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>

using namespace std;

//void handler(int signo)
//{
//    cout <<"get a signo: " << signo << endl;
//
//    pid_t id = 0;
//    while((id = waitpid(-1, nullptr, WNOHANG)))
//    {
//        if(id <= 0) break;
//        cout << "回收进程：" << id << endl;
//    }
//}

int main()
{
    signal(SIGCHLD, SIG_IGN); // Linux支持手动忽略SIGCHLD, 所有的子进程都不要父进程进行等待了！！退出自动回收Z
    // 6退出，4没退
    for(int i = 0; i < 10; i++)
    {
        pid_t id = fork();
        if(id == 0)
        {
            cout << "child is running" << endl;
            sleep(5);
            exit(10);
        }
    }

    while(true) sleep(1);
    //sleep(10);
   // int cnt = 10;
   // while(cnt--)
   // {
   //     cout << "cnt: " << cnt << endl;
   //     sleep(1);
   // }
   // wait(NULL);

    return 0;
}

//volatile int flag = 0;
//
//void handler(int signo)
//{
//    std::cout << "signo: " << signo <<std::endl;
//    flag = 1;
//    std::cout << "change flag to: " << flag <<std::endl;
//}
//
//int main()
//{
//    signal(2, handler);
//    std::cout << "getpid: " << getpid() << std::endl;
//    while(!flag);
//    std::cout << "quit normal!" << std::endl;
//}

//void Print(const sigset_t &pending);
//
//void handler(int signo)
//{
//    std::cout << "get a sig: " << signo << std::endl;
//    sleep(1);
////    while(true)
////    {
////        sigset_t pending;
////        sigpending(&pending);
////        Print(pending);
////        sleep(1);
////    }
//}
//
//void Print(const sigset_t &pending)
//{
//    for(int signo = 31; signo > 0; signo--)
//    {
//        if(sigismember(&pending, signo))
//        {
//            std::cout << "1";
//        }
//        else
//        {
//            std::cout << "0";
//        }
//    }
//    std::cout << std::endl;
//}
//
//int main()
//{
//    signal(2, handler);
//    signal(3, handler);
//    signal(4, handler);
//    signal(5, handler);
//
//
//    sigset_t mask, omask;
//    sigemptyset(&mask);
//    sigemptyset(&omask);
//
//    sigaddset(&mask, 2);
//    sigaddset(&mask, 3);
//    sigaddset(&mask, 4);
//    sigaddset(&mask, 5);
//
//    sigprocmask(SIG_SETMASK, &mask, &omask);
//
//
////    std::cout << "pid: " << getpid() << std::endl;
////    struct sigaction act, oact;
////    act.sa_handler = handler;
////    sigemptyset(&act.sa_mask);
////    sigaddset(&act.sa_mask, 3);
////
////    sigaction(2, &act, &oact);
//
//    printf("getpid: %d\n", getpid());
//    int cnt = 20;
//    while(true)
//    {
//        sigset_t pending;
//        sigpending(&pending);
//        Print(pending);
//        cnt--;
//        sleep(1);
//        if(cnt == 0)
//        {
//            sigprocmask(SIG_SETMASK, &omask, nullptr);
//            std::cout << "cancel 2,3,4,5 block" << std::endl;
//        }
//    }
//
//    return 0;
//}
